<?php

declare(strict_types=1);

namespace app\admin\service;

use app\admin\model\LogisticsCompany as LogisticsCompanyModel;
use app\admin\common\ServiceResponse;

class LogisticsCompany extends BaseService
{
    use ServiceResponse;

    protected $model;
    public function __construct()
    {
        parent::__construct();
        $this->model = new LogisticsCompanyModel();
    }

    /**
     * @describe 获取物流公司列表
     * @author: Bobo
     * @date: 2024-06-05 18:02:26
     * @param [] type
     * @return Renderable
     */
    public function getList(array $where, int $page, int $limit)
    {
        if (0 >= $page || 100 < $limit) {
            return $this->error(100002);
        }
        $total = $this->model->where($where)->count();
        $list = $this->model->with(['get_creator_name', 'get_update_name', 'parent_company'])->where($where)
            ->page($page, $limit)
            ->append(['status_value', 'company_type_value'])
            ->order('company_type', 'asc')
            ->order('fl_id', 'asc')
            ->select()
            ->toArray();

        $data = ['list' => $list, 'total' => $total];
        return $this->success($data);
    }

    /**
     * 获取物流公司详情
     * @param int $id 物流公司ID
     */
    public function getOneById($id)
    {
        $customerContact = $this->model->with(['parent_company'])->find($id);
        if ($customerContact) {
            $data = $customerContact->append([
                'creator_value',
                'updater_value',
                'status_value',
                'company_type_value'
            ]);
        }
        $data = $data->toArray();
        return $this->success($data);
    }

    /**
     * 创建物流公司
     * @param array $data 创建物流公司的数据
     */
    public function create($data)
    {
        try {
            // 验证上级公司关系
            if ($data['company_type'] == 2) {
                // 如果是承运/快递公司，必须选择上级公司
                if (empty($data['fl_id'])) {
                    return $this->error(100001, '承运/快递公司必须选择上级物流公司');
                }

                // 验证上级公司是否存在且为货代/物流公司
                $parentCompany = $this->getOneById($data['fl_id']);
                if ($parentCompany['code'] !== 0 || $parentCompany['data']['company_type'] != 1) {
                    return $this->error(100001, '选择的上级公司不存在或不是货代/物流公司');
                }
            } else {
                // 如果是货代/物流公司，不能有上级公司
                $data['fl_id'] = null;
            }

            $res = $this->model->create($data);
            if ($res) {
                $this->logger->logOperation($res->id,'LogisticsCompany','创建','创建物流公司');
                return $this->success();
            } else {
                return $this->error(500001);
            }
        } catch (\Throwable $th) {
            return $this->error(500001, '服务器内部错误：' . $th->getMessage());
        }
    }

    /**
     * 更新物流公司
     * @param array $data 更新物流公司的数据
     */
    public function update($data)
    {
        try {
            // 获取原有数据
            $res = $this->model->where('id', $data['id'])->find();
            if (!$res) {
                return $this->error(100001, '物流公司不存在');
            }

            // 如果修改了公司类型
            if (isset($data['company_type']) && $data['company_type'] != $res->company_type) {
                // 检查是否有下级公司
                $hasChildren = $this->model->where([
                    ['fl_id', '=', $data['id']],
                    ['is_del', '=', 0]
                ])->count() > 0;

                if ($hasChildren) {
                    return $this->error(100001, '该公司存在下级公司，不能修改公司类型');
                }

                // 验证上级公司关系
                if ($data['company_type'] == 2) {
                    // 如果改为承运/快递公司，必须选择上级公司
                    if (empty($data['fl_id'])) {
                        return $this->error(100001, '承运/快递公司必须选择上级物流公司');
                    }

                    // 验证上级公司是否存在且为货代/物流公司
                    $parentCompany = $this->getOneById($data['fl_id']);
                    if ($parentCompany['code'] !== 0 || $parentCompany['data']['company_type'] != 1) {
                        return $this->error(100001, '选择的上级公司不存在或不是货代/物流公司');
                    }
                } else {
                    // 如果改为货代/物流公司，清除上级公司
                    $data['fl_id'] = null;
                }
            }

            foreach ($data as $key => $value) {
                if ($res->$key != $value) {
                    $res->$key = $value;
                }
            }

            $result = $res->save();
            if ($result) {
                $this->logger->logOperation($res->id,'LogisticsCompany','更新','更新物流公司');
                return $this->success();
            } else {
                return $this->error(500001);
            }
        } catch (\Throwable $th) {
            return $this->error(500001, '服务器内部错误：' . $th->getMessage());
        }
    }

    /**
     * 删除物流公司
     * @param int $id 物流公司ID
     */
    public function delete($id)
    {
        return $this->batchLogicalDelete($id);
    }

    /**
     * @describe 批量逻辑删除物流公司
     * @author: Bobo
     * @date: 2024-06-26 14:53:00
     * @param [arr] @required $ids ID数组
     * @return Renderable
     */
    public function batchLogicalDelete($ids)
    {
        try {
            // 开始事务
            $this->model->startTrans();
            try {
                // 将逗号分隔的字符串转换为数组
                $idArray = explode(',', $ids);

                // 检查是否有关联的客户
                $companies = $this->model->where('id', 'in', $idArray)->field('id,name,company_type')->select()->toArray();

                // 获取所有需要删除的ID（包括子公司）
                $allIds = $idArray;
                foreach ($companies as $company) {
                    if ($company['company_type'] == 1) {
                        // 如果是父公司，查找其所有子公司
                        $childIds = $this->model->where([
                            ['fl_id', '=', $company['id']],
                            ['is_del', '=', 0]
                        ])->column('id');
                        if (!empty($childIds)) {
                            $allIds = array_merge($allIds, $childIds);
                        }
                    }
                }

                // 删除所有相关公司（设置 is_del 为当前时间戳）
                $timestamp = time();
                $this->model->where('id', 'in', $allIds)->update(['is_del' => $timestamp]);

                // 记录操作日志
                $this->logger->logOperation( $allIds, 'LogisticsCompany', '批量删除', '批量删除物流公司及其子公司');

                // 提交事务
                $this->model->commit();
                return $this->success();
            } catch (\Throwable $th) {
                // 回滚事务
                $this->model->rollback();
                throw $th;
            }
        } catch (\Throwable $th) {
            return $this->error(500001, $th->getMessage());
        }
    }

    /**
     * 批量更新状态
     * @param array $ids 物流公司ID数组
     * @param int $status 状态值 0-关闭 1-开启
     * @return array
     */
    public function batchUpdateStatus($ids, $status)
    {
        try {
            // 参数验证
            if (!is_array($ids) || empty($ids)) {
                return $this->error(100001, '请选择要修改的物流公司');
            }
            if (!in_array($status, [0, 1])) {
                return $this->error(100001, '状态值无效');
            }

            // 开始事务
            $this->model->startTrans();
            try {
                // 更新选中的公司状态
                $updateResult = $this->model->where([
                    ['id', 'in', $ids],
                    ['is_del', '=', 0]
                ])->update(['status' => $status]);

                // 查找选中公司中的一级物流公司
                $parentCompanies = $this->model->where([
                    ['id', 'in', $ids],
                    ['is_del', '=', 0],
                    ['company_type', '=', 1] // 只查找货代/物流公司
                ])->select();

                // 收集所有需要更新的子公司ID
                $childIds = [];
                foreach ($parentCompanies as $company) {
                    // 查找该公司的所有子公司
                    $children = $this->model->where([
                        ['fl_id', '=', $company['id']],
                        ['is_del', '=', 0]
                    ])->column('id');

                    if (!empty($children)) {
                        $childIds = array_merge($childIds, $children);
                    }
                }

                // 如果有子公司，更新它们的状态
                if (!empty($childIds)) {
                    $this->model->where([
                        ['id', 'in', $childIds],
                        ['is_del', '=', 0]
                    ])->update(['status' => $status]);
                }

                // 提交事务
                $this->model->commit();
                $this->logger->logOperation($ids, 'LogisticsCompany', '批量修改状态', '批量修改物流公司及其子公司状态');
                return $this->success();

            } catch (\Throwable $th) {
                // 回滚事务
                $this->model->rollback();
                throw $th;
            }
        } catch (\Throwable $th) {
            return $this->error(500001, '服务器内部错误：' . $th->getMessage());
        }
    }

    /**
     * @describe
     * @author: Bobo
     * @date: 2024-08-06 19:08:17
     * @param [type] @required
     * @return Renderable
     */
    /**
     * @describe
     * @author: Bobo
     * @date: 2024-07-23 10:34:00
     * @param [type] @required
     * @return Renderable
     */
    public function getFieldEnum($field)
    {
        $res = $this->model->getFieldEnum($field);
        return [
            'code' => 0,
            'data' => $res
        ];
    }

    public function getSelect()
    {
        $where = [['is_del','=',0]];
        $arrData = ['code' => 0, 'message' => 'success'];

        $oLogisticsCompanyModel = LogisticsCompanyModel::where($where);
        $total = $oLogisticsCompanyModel->count();
        $result = $oLogisticsCompanyModel->field('id AS value,name as label')->select();
        $arrData['data'] = ['list' => $result->toArray(), 'total' => $total];
        return $arrData;
    }
}
